Schlankes, per-Produkt getrenntes SaaS-Infra-Modell mit zentraler Steuerung – alles auf Hetzner (EU).
staging-1); Produktion bekommt pro Produkt ein eigenes Hetzner-Projekt/VM (ADR-009).control) verwaltet alle Hosts und Deployments.node1 (Sentry, Loki, Meilisearch, ClamAV, mCaptcha, NSFW-API), erreichbar über ein privates WireGuard-Mesh.infra/-Repo mit STANDARDS, nummerierten ADRs und Runbooks ist die Quelle der Wahrheit.| Host | Provider / Typ | Spec | Public-IP | Mesh-IP | Rolle |
|---|---|---|---|---|---|
control | Hetzner Cloud · cx33 | 4C / 8 GB / 80 GB | 195.201.133.26 | 10.42.0.1 | Coolify-Control-Plane, Prometheus + Grafana, WireGuard-Server |
staging-1 | Hetzner Cloud · cpx42 | 8C / 15 GB / 75 GB | 46.225.5.93 | 10.42.0.3 | Gemeinsamer SaaS-Staging-Host (boilerplate, mITapp, künftig HiveGrid) |
node1 (EX44) | Hetzner Dedicated (Robot) | 20C / 62 GB / 436 GB | 176.9.111.179 | 10.42.0.4 | Zentrale Dienste: Sentry, Loki, Meilisearch, ClamAV, mCaptcha, NSFW-API |
marketing | Hetzner Cloud · cx33 | 4C / 8 GB / 80 GB | 128.140.109.153 | 10.42.0.5 | Marketing-Sites (hivegrid.de, tool-ctrl.de) |
mitapp-prod | Hetzner Cloud · cpx22 | 2C / 4 GB / 80 GB | 178.104.213.13 | 10.42.0.6 | mITapp Produktion |
homeserver | Self-hosted (DDNS) | 16C / 30 GB / 935 GB | DDNS | 10.42.0.2 | Gitea, CI-Runner, Authentik, Vaultwarden, interne Tools |
Alle Cloud-Hosts in Hetzner-Regionen nbg1/fsn1 (Deutschland). node1 im RZ FSN1-DC8. SSH per Schlüssel (~/.ssh/node1 für alle Hetzner-Hosts).
Workloads sind in getrennte Hetzner-Cloud-Projekte aufgeteilt (Abrechnung/Isolation). Produktion erhält pro Produkt ein eigenes Projekt (ADR-009).
| Projekt | Zweck | VM(s) | Status |
|---|---|---|---|
| DevOps | Coolify-Control-Plane | control (cx33) | live |
| Staging | SaaS-Staging-Pool | staging-1 (cpx42) | live |
| Marketing | Marketing-Workload | marketing (cx33) | live |
| probono | mITapp-Produktion | mitapp-prod (cpx22) | live |
| HiveGrid | HiveGrid-Cloud-Prod (geplant, ADR-009) | — | geplant |
| Boilerplate | Boilerplate-Prod (geplant, ADR-009) | — | geplant |
Dazu: 1 Dedicated-Server (node1, Hetzner Robot) für zentrale Dienste und der self-hosted homeserver für CI/SSO.
Alle Hosts hängen in einem privaten WireGuard-Mesh 10.42.0.0/24 mit Stern-Topologie: control ist Server (UDP 51820), alle anderen sind Peers. Inter-Host-Verkehr (Metrics-Scrapes, zentrale Dienste) läuft ausschließlich über Mesh-IPs – nicht über öffentliche Endpunkte.
| Host | Interface | Mesh-IP | Rolle im Mesh |
|---|---|---|---|
| control | wg0 | 10.42.0.1/24 | Server |
| homeserver | wg1 | 10.42.0.2/24 | Peer (eigenes wg0 bleibt Heim-VPN) |
| staging-1 | wg0 | 10.42.0.3/24 | Peer |
| node1 | wg1 | 10.42.0.4/24 | Peer (eigenes wg0 separates VPN) |
| marketing | wg0 | 10.42.0.5/24 | Peer |
| mitapp-prod | wg0 | 10.42.0.6/24 | Peer |
Coolify v4 auf control (Dashboard https://saas-ctrl.com) ist die zentrale Steuerung. Jeder Ziel-Host ist als Server registriert; pro Produkt gibt es ein Projekt, pro Stufe ein Environment, pro Dienst eine Resource.
dockerimage: Coolify baut nicht selbst, sondern zieht vorgefertigte Images aus der Gitea-Registry.coolify-proxy) je Host, TLS via Let's Encrypt (ACME). Auf node1 hat Traefik seit der ADR-013-Migration das frühere Host-Caddy ersetzt.Einmal zentral betrieben, von allen Produkten über das Mesh genutzt. Index-/Key-Konventionen pro Produkt sorgen für Trennung.
| Dienst | Erreichbar | Zweck / Hinweise |
|---|---|---|
| Sentry | sentry.saas-ctrl.com | Error-Tracking. 1 Org, 1 Team pro Produkt, 1 Projekt pro Codebasis; Staging/Prod über Environment-Tags. |
| Loki | 10.42.0.4:3100 (mesh) | Zentrale Logs; Promtail-Collector auf jedem Host; 7 Tage Retention. |
| Meilisearch | 10.42.0.4:7700 (mesh) | Volltextsuche; pro Produkt ein Scoped-Key, Index-Präfix <produkt>-*. |
| ClamAV | 10.42.0.4:3310 (mesh) | Virenscan per TCP-INSTREAM; Default fail-closed für Uploads. |
| NSFW-API | 10.42.0.4:3000 (mesh) | Bild-Klassifikation; Default fail-open. |
| mCaptcha | captcha.saas-ctrl.com | Captcha-Service (Sitekey-verwaltet). |
Zentral auf control: Prometheus scrapt jeden Host über das Mesh (alle 30 s), Grafana (grafana.saas-ctrl.com) visualisiert. Logs zentral in Loki, Errors in Sentry.
node-exporter (:9100) und docker-stats-exporter (:9487) auf der jeweiligen Mesh-IP.project, environment, server, service – damit lassen sich Dashboards pro Produkt/Host filtern.estate-overview (flottenweit) plus je Host/Produkt eines (project-staging, project-hetzner-ex44, project-mitapp, …).SaaS-App in aktiver Entwicklung (Git-Downstream des Boilerplates). Noch nicht deployt. Folgt bei Reife dem Estate-Modell: Staging auf staging-1 (oder eigenes Projekt), Prod als eigenes Hetzner-Projekt „HiveGrid" gemäß ADR-009; zentrale Dienste auf node1. Nicht verwechseln mit der Marketing-Site hivegrid.de.
Statische/Next.js-Site auf marketing, Domain hivegrid.de (Cloudflare-proxied), TLS über Traefik. Leads lokal in SQLite-Volume.
Staging auf staging-1 (Coolify-Projekt „boilerplate" / „validation"): web + api + 5 Worker, Postgres (Coolify-managed) + PgBouncer, Authentik unter auth.boiler.saas-ctrl.com; Suche/Virenscan/Errors zentral auf node1. Prod laut ADR-009 als eigenes Projekt geplant, noch nicht live.
Prod auf mitapp-prod (cpx22): App + Worker (Image-Tag :prod), Uploads-Sidecar (nginx), Postgres 16 + Redis 7 (Coolify-managed). Domains mitapp.de (kanonisch) + api.mitapp.de (mobil) sowie Legacy mitapp.mitup.de (muss /api/* + /.well-known/* für ausgelieferte Mobile-Apps bedienen). Staging auf staging-1 (staging.mitapp.de, Basic-Auth). CI/CD nach Modell „Build-once / Promote".
main (Tag :latest + :sha-…).promote.yml-Dispatch retaggt ein bereits gebautes SHA-Image auf :prod (kein Rebuild) und deployt es. Rollback = altes SHA neu deployen.docker login gegen die Gitea-Registry.DNS zentral in Cloudflare. User-facing-Domains laufen über den Cloudflare-Proxy; Origins, die selbst Let's-Encrypt-Zertifikate ausstellen, stehen auf „DNS-only". Transaktionsmails über Mailjet (DKIM/SPF je Zone), eingehende Mail über mailbox.org.
| Domain / Subdomain | Ziel-Host | Zweck |
|---|---|---|
saas-ctrl.com | control | Coolify-Dashboard |
grafana.saas-ctrl.com | control | Monitoring |
sentry.saas-ctrl.com · captcha.saas-ctrl.com | node1 | Zentrale Dienste |
boiler.saas-ctrl.com · auth.boiler… | staging-1 | Boilerplate-Staging + Admin-SSO |
hivegrid.de | marketing | HiveGrid-Marketing-Site |
tool-ctrl.de (+ git,auth,…) | marketing / homeserver | Marketing + interne Tools (DDNS) |
mitapp.de · api.mitapp.de · staging.mitapp.de | mitapp-prod / staging-1 | mITapp Prod/API/Staging |
Aktive Zonen u. a.: saas-ctrl.com, hivegrid.de, mitapp.de, mitup.de, tool-ctrl.de, power-linked.de (reserviert). TLS-Modus durchgehend „Strict".
~/.cli-tokens/ (chmod 600).homeserver.Grundsatz aus STANDARDS: keine Secrets im Repo, keine Klartext-Weitergabe in Chats. (Konkrete Schlüsselwerte und Dateipfade sind in diesem Dokument bewusst ausgespart.)
| Komponente | Disposabel? | Backup / Recovery |
|---|---|---|
Coolify-State (/data/coolify auf control) | nein (alle Deploy-Configs) | nur lokaler Teil-Snapshot; automatisiertes S3-Export geplant |
| Produkt-DBs (Postgres, Prod/Staging) | nein (Kundendaten) | Coolify-Auto-Backup zu aktivieren/dokumentieren |
| Sentry / Loki / ClamAV / mCaptcha (node1) | ja (nur Historie/Sig-DB) | kein Backup – werden bei Bedarf neu aufgesetzt |
| Meilisearch-Index | teilweise | aus Postgres reindizierbar; S3-Snapshots geplant |
Geplant: Synology-NAS zieht per Hyper Backup von control und homeserver; Off-Site-/Objekt-Speicher über Hetzner Object Storage (S3, EU).
Recovery-Kurzform: node1-Ausfall → Dienste neu deployen (Daten verworfen). control-Ausfall → /data/coolify wiederherstellen, Coolify starten, Apps neu deployen. Produkt-DB → aus Postgres-Backup wiederherstellen (sobald aktiviert).
Verbindlich aus infra/STANDARDS.md (Kurzfassung):
project/server).~/.cli-tokens/, chmod 600, keine Chat-Pastes).decisions/, nummeriert).Neutral zusammengefasst aus README-/LESSONS-To-dos (Stand Juni 2026):
:prod-Promote noch ausstehend; Legacy-Compose-Stack nach Bewährungsfenster abbauen.Stand 14. Juni 2026. Quelle der Wahrheit ist das infra/-Repository (README.md, STANDARDS.md, LESSONS.md, decisions/, runbooks/). Bei Abweichungen gilt das Repo. Konkrete Geheimnisse/Schlüssel sind hier bewusst ausgespart.